﻿using System;
using System.Collections;
using System.Linq;
using System.Text;

namespace GIFT
{
    class ControlComando
    {

        //Constructor de la clase
        public ControlComando()  
        {
            consultaComando = new ConsultaComando();
            llenarSintaxisTexto();
            llenarSintaxisNumero();
        }

        //Llena la sintaxis de texto
        private void llenarSintaxisTexto()
        {
            listaSintaxisTexto = new ArrayList();
            listaSintaxisTexto.AddRange(new object[]{
            "$",
            "Otro"});
        }

        //Llena la sintaxis de numero
        private void llenarSintaxisNumero()
        {
            listaSintaxisNumero = new ArrayList();
            listaSintaxisNumero.AddRange(new object[]{
            "<",
            ">",
            "<=",
            ">=",
            "==",
            "!="});
        }

        //Retorna una lista con la sintaxis para textos
        public ArrayList getSintaxisTexto()
        {
            return listaSintaxisTexto;
        }

        //Retorna una lista con la sintaxis para numeros
        public ArrayList getSintaxisNumero()
        {
            return listaSintaxisNumero;
        }

        //Obtiene los comandos 
        public ArrayList obtenerComandos()
        {
            ArrayList nombres = consultaComando.obtieneComandos(); //Obtiene los comandos y los retorna
            return nombres;
        }

        //Recibe un nombre y retorna true si este ya existe en la base de datos
        public bool existe(String nombre)
        {
            if (consultaComando.existeComando(nombre))//Si ya existe
            {
                return true;
            }
            return false;
        }

        //Obtiene el tipo de formulario
        public String retornaTipo(String nombreComando)
        {
            return consultaComando.buscarAtributoBasicoComando(nombreComando, "tipo");
        }

        //Obtiene los datos de un comando con mascara y retorna los datos empequetados en una clase
        public ComandoMascara obtieneComandoConMascara(String nombreComando)
        {
            ArrayList atributosBasicos = consultaComando.obtenerAtributosBasicos(nombreComando);//Obtiene datos basicos
            ComandoMascara comandoConMascara = new ComandoMascara(atributosBasicos[1].ToString(), atributosBasicos[2].ToString(), atributosBasicos[3].ToString(), atributosBasicos[0].ToString(), atributosBasicos[5].ToString());//Crea una clase
            ArrayList mascaras = consultaComando.obtieneMascarasDeComando(nombreComando);
            ArrayList datosMascara = new ArrayList();
            for (int i = 0; i < mascaras.Count; ++i)
            {
                datosMascara = consultaComando.obtenerAtributosMascara(mascaras[i].ToString());
                Mascara mascaraNueva = new Mascara(datosMascara[4].ToString(), datosMascara[1].ToString(), datosMascara[5].ToString(), datosMascara[6].ToString(), datosMascara[2].ToString(), datosMascara[3].ToString(), datosMascara[0].ToString());
                (comandoConMascara.getMascaras()).Add(mascaraNueva);
            }
            return comandoConMascara;
        }

        //Obtiene los datos de un comando sin mascara y retorna los datos empequetados en una clase
        public ComandoSinMascara obtieneComandoSinMascara(String nombreComando)
        {
            ArrayList atributosBasicos = consultaComando.obtenerAtributosBasicos(nombreComando);//Obtiene datos basicos
            ArrayList atributosEspecificos = consultaComando.obtenerAtributosComandoSinMascara(atributosBasicos[0].ToString()); //Obtiene datos especificos
            ComandoSinMascara comandoSinMascara = new ComandoSinMascara(atributosBasicos[1].ToString(), atributosBasicos[2].ToString(), atributosBasicos[3].ToString(), atributosBasicos[0].ToString(), atributosBasicos[5].ToString());//Crea una clase
            comandoSinMascara.setNivelDerechos(atributosEspecificos[1].ToString());
            return comandoSinMascara;
        }

        //Obtiene los datos de un comando de busqueda y retorna los datos empequetados en una clase
        public ComandoBusqueda obtieneComandoBusqueda(String nombreComando)
        {
            ArrayList atributosBasicos = consultaComando.obtenerAtributosBasicos(nombreComando);//Obtiene datos basicos
            ArrayList filtros = consultaComando.obtieneFiltrosDeComando(nombreComando);
            ComandoBusqueda comandoBusqueda = new ComandoBusqueda(atributosBasicos[1].ToString(), atributosBasicos[2].ToString(), atributosBasicos[3].ToString(), atributosBasicos[0].ToString(), atributosBasicos[5].ToString());//Crea una clase
            ArrayList datosFiltros = new ArrayList();
            for (int i = 0; i < filtros.Count; ++i)
            {
                datosFiltros = consultaComando.obtenerAtributosFiltroBusqueda(filtros[i].ToString());
                FiltroBusqueda filtroNuevo = new FiltroBusqueda(datosFiltros[1].ToString(), datosFiltros[2].ToString(), datosFiltros[0].ToString());
                comandoBusqueda.agregarFiltro(filtroNuevo);
            }
            return comandoBusqueda;
        }

        //Guarda los datos de un comando con mascara, retorna true si era nada mas de guardar
        public bool guardarConMascara(ComandoMascara comando)
        {
            if (consultaComando.existeComando(comando.getNombre())) //Si es nada mas guardar
            {
                consultaComando.modificarComando(comando.getNombre(), comando.getdescripcion(), comando.getTipo(), comando.getIdFormulario());
                for (int i = 0; i < comando.getMascaras().Count; ++i)
                {
                    guardarMascara((Mascara)comando.getMascaras()[i]);
                }
                return true;
            }
            else //Si es crearlo nuevo
            {
                consultaComando.crearComando(comando.getNombre(), comando.getdescripcion(), comando.getTipo(), comando.getIdFormulario());
                String idComando = consultaComando.buscarAtributoBasicoComando(comando.getNombre(), "id");
                comando.setId(idComando);
                for (int i = 0; i < comando.getMascaras().Count; ++i)
                {
                    ((Mascara)comando.getMascaras()[i]).setIdComando(comando.getId());
                    guardarMascara((Mascara)comando.getMascaras()[i]);
                    
                }
            }
            return false;
        }

        //Guarda una mascara en la base de datos
        private void guardarMascara(Mascara mascara)
        {
            if (consultaComando.existeMascaraId(mascara.getId()))//si es modificar
            {
                consultaComando.modificarMascara(mascara.getId(), mascara.getIdTipoCampoReferencia(), mascara.getValorPrevio(), mascara.getValorPosterior(), mascara.getIdComando(), mascara.getIdTipoCampoModificado(), mascara.getNombre());
            }
            else //si es crear
            {
                String idMascara = consultaComando.crearMascara(mascara.getIdTipoCampoReferencia(), mascara.getValorPrevio(), mascara.getValorPosterior(), mascara.getIdComando(), mascara.getIdTipoCampoModificado(), mascara.getNombre());
                mascara.setId(idMascara);
            }
        }

        //Guarda los datos de un comando sin mascara, retorna true si era nada mas de guardar
        public bool guardarSinMascara(ComandoSinMascara comando)
        {
            if (consultaComando.existeComando(comando.getNombre())) //Si es nada mas guardar
            {
                consultaComando.modificarComando(comando.getNombre(), comando.getdescripcion(), comando.getTipo(), comando.getIdFormulario());
                consultaComando.modificarComandoSinMascara(comando.getId(), comando.getId(), comando.getNivelDerechos());
                return true;
            }
            else //Si es crearlo nuevo
            {
                consultaComando.crearComando(comando.getNombre(), comando.getdescripcion(), comando.getTipo(), comando.getIdFormulario());
                String idComando = consultaComando.buscarAtributoBasicoComando(comando.getNombre(), "id");
                comando.setId(idComando);
                consultaComando.crearComandoSinMascara(idComando, comando.getNivelDerechos());
            }
            return false;
        }

        //Guarda los datos de un comando de busqueda, retorna true si era nada mas de guardar
        public bool guardarBusqueda(ComandoBusqueda comando)
        {
            if (consultaComando.existeComando(comando.getNombre())) //Si es nada mas guardar
            {
                consultaComando.modificarComando(comando.getNombre(), comando.getdescripcion(), comando.getTipo(), comando.getIdFormulario());
                for (int i = 0; i < comando.getFiltros().Count; ++i)
                {
                    guardarFiltro((FiltroBusqueda)comando.getFiltros()[i]);
                }
                return true;
            }
            else //Si es crearlo nuevo
            {
                consultaComando.crearComando(comando.getNombre(), comando.getdescripcion(), comando.getTipo(), comando.getIdFormulario());
                String idComando = consultaComando.buscarAtributoBasicoComando(comando.getNombre(), "id");
                comando.setId(idComando);
                for (int i = 0; i < comando.getFiltros().Count; ++i)
                {
                    ((FiltroBusqueda)comando.getFiltros()[i]).setIdComando(comando.getId());
                    guardarFiltro((FiltroBusqueda)comando.getFiltros()[i]);
                }
            }
            return false;
        }

        //Guarda un filtro en la base de datos
        private void guardarFiltro(FiltroBusqueda filtro)
        {
            if (consultaComando.existeFiltro(filtro.getId()))//si es modificar
            {
                consultaComando.modificarFiltroDeBusqueda(filtro.getId(), filtro.getIdTipoCampo(), filtro.getIdComando());
            }
            else //si es crear
            {
                String idFiltro = consultaComando.crearFiltroBusqueda(filtro.getIdComando(), filtro.getIdTipoCampo());
                filtro.setId(idFiltro);
            }
        }

        //Manda a borrar un comando
        public void borrar(String nombre)
        {
            consultaComando.borrarComando(nombre);
        }

        //Retorna true si la existe una mascara con el nombre que recibe como parametro
        public bool existeMascaraNombre(String nombreMascara)
        {
            return consultaComando.existeMascaraNombre(nombreMascara);
        }

        //Retorna true si id existe una mascara con el nombre que recibe como parametro
        public bool existeMascaraId(String idMascara)
        {
            return consultaComando.existeMascaraId(idMascara);
        }

        //Borra una mascara que contenga el nombre que recibe como parametro
        public void eliminarMascara(String nombreMascara)
        {
            String idMascara = consultaComando.buscarAtributoMascara(nombreMascara,"id");
            if (idMascara != "ERROR")
            {
                consultaComando.borrarMascara(idMascara);
            }
        }

        //Borra un filtro que contenga el id que recibe como parametro
        public void eliminarFiltroBusqueda(String idFiltro)
        {
            consultaComando.borrarFiltroBusqueda(idFiltro);
        }

        //Retorna un arreglo con los nombres de los comandos que contengan la hilera que reciba como parametro en el nombre o la descripcion
        public ArrayList buscarContenido(String aBuscar)
        {
            ArrayList nombres = consultaComando.buscarConcordanciasComando(aBuscar);//Agrega al arreglo los nombres 
            return nombres;
        }

        //Variables globales
        private ConsultaComando consultaComando;
        private ArrayList listaSintaxisTexto;
        private ArrayList listaSintaxisNumero;


    }//fin de la clase
}
